package com.hmall.item.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.hmall.item.constants.MyMqConstants;
import com.hmall.item.mapper.ItemMapper;
import com.hmall.item.pojo.Item;
import com.hmall.item.pojo.PageItem;
import com.hmall.item.result.PageResult;
import com.hmall.item.result.Result;
import com.hmall.item.service.ItemService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.security.InvalidParameterException;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;

@Service
public class ItemServiceImpl extends ServiceImpl<ItemMapper, Item> implements ItemService {
    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 分页 非MP
     *
     * @param pageItem
     * @return
     */
    @Override
    public PageResult<Item> pageInfo(PageItem pageItem) {
/*//        1.组装分页
        Page<Item> pageInfo = PageHelper.startPage(pageItem.getPage(), pageItem.getSize());
//        2.发sql
        itemMapper.pageInfo();
//        3.返回参数
        return new PageResult(pageInfo.getTotal(), pageInfo.getResult());*/
        /**
         * 使用MP，查询的是 为删除的 包含 status = 1 上架的 和下架的 status = 2的商品
         */
//        1.创建IPage分页对象,并设置初始值
        IPage<Item> pageInfo = new Page<>(pageItem.getPage(), pageItem.getSize());
//        2.执行分页查询(条件是，status！=3 按照创建时间降序排列)
        lambdaQuery().ne(Item::getStatus, 3)
                .orderByDesc(Item::getCreateTime)
                .page(pageInfo);
//        3.获取结果返回
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getRecords());
    }

    /**
     * 根据ID查询 且status不为3
     *
     * @param id
     * @return
     */
    @Override
    public Item getByIdAndStatus(Long id) {
        LambdaQueryWrapper<Item> lqw = new LambdaQueryWrapper<>();
        lqw.ne(Item::getStatus, 3).eq(Item::getId, id);
        return itemMapper.selectOne(lqw);
    }

    /**
     * 商品上下架
     *
     * @param item
     */
    @Override
    public void updateItemByStatus(Item item) {
//        修改是不需要查询条件的
  /*      LambdaQueryWrapper<Item> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Item::getId, item.getId())
                .eq(Item::getStatus, item.getStatus())
                .eq(Item::getCreateTime, LocalDateTime.now());
//        itemMapper.update(item, lqw);*/
        item.setUpdateTime(new Date());
        itemMapper.updateById(item);
//        使用MQ的异步调用 处理上下架商品
        if (item.getStatus() == 1) {
//            上架 等于是新增到es中
            rabbitTemplate.convertAndSend(MyMqConstants.ITEM_EXCHANGE, MyMqConstants.ITEM_INSERT_KEY, item.getId());
        } else {
//            status=2 或者3时就是删除
            rabbitTemplate.convertAndSend(MyMqConstants.ITEM_EXCHANGE, MyMqConstants.ITEM_DELETE_KEY, item.getId());
        }
    }

    /**
     * 修改商品
     */
    @Override
    public void updateItem(Item item) {
        if (item.getId() == null) {
            throw new InvalidParameterException("id 不能为空！");
        }
        item.setUpdateTime(new Date());
        itemMapper.updateById(item);
//        异步回调MQ
        rabbitTemplate.convertAndSend(MyMqConstants.ITEM_EXCHANGE, MyMqConstants.ITEM_INSERT_KEY, item.getId());
    }

    /**
     * 删除商品 status = 3
     */
    @Override
    public void delItemById(long id) {
        Item item = new Item();
        item.setUpdateTime(new Date());
//        删除商品 status = 3
        item.setStatus(3);
        item.setId(id);
        itemMapper.updateById(item);

//        MQ回调删除es
        rabbitTemplate.convertAndSend(MyMqConstants.ITEM_EXCHANGE, MyMqConstants.ITEM_DELETE_KEY, item.getId());

    }

    @Override
    public Result<List<Item>> all() {
        List<Item> items = itemMapper.selectList(null);
        return Result.success(items);
    }

    /**
     * es中只导入数据status为1的商品数据
     *
     * @param pageItem
     * @return
     */
    @Override
    public PageResult<Item> pageInfoES(PageItem pageItem) {
        /**
         * 使用MP，查询的是 为删除的 包含 status = 1 上架的 和下架的 status = 2的商品
         */
//        1.创建IPage分页对象,并设置初始值
        IPage<Item> pageInfo = new Page<>(pageItem.getPage(), pageItem.getSize());
//        2.执行分页查询(es中展示的条件是，status！=1 按照创建时间降序排列)
        lambdaQuery().eq(Item::getStatus, 1)
                .orderByDesc(Item::getCreateTime)
                .page(pageInfo);
//        3.获取结果返回
        return new PageResult<>(pageInfo.getTotal(), pageInfo.getRecords());
    }
}
